/*
 * Copyright (C) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the 'License');
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an 'AS IS' BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef IMAGE_KNIFE_C_IMAGEKNIFE_NODE_H
#define IMAGE_KNIFE_C_IMAGEKNIFE_NODE_H

#include "animator_option.h"
#include "imageknife_option.h"

namespace ImageKnifePro {
/**
 * @brief ImageKnife图片组件节点，可以创建动图节点。
 * 普通节点在显示动图时，将编码成base64然后处理简单显示，不会执行解码责任链以及图形变换过程。
 */
class ImageKnifeNode {
public:
    /**
     * @brief 创建ImageKnifeNode图片节点来显示静态图片
     * @param option 图片加载选项，包含了图片来源等相关参数
     * @return 返回ImageKnifeNode组件节点智能指针
     */
    static std::shared_ptr<ImageKnifeNode> CreateImageKnifeNode(std::shared_ptr<ImageKnifeOption> option);
    /**
     * @brief 创建ImageKnifeNode动图节点来显示动态图片
     * @param option 图片加载选项，包含了图片来源等相关参数
     * @param animatorOption 动图控制选项
     * @return 返回ImageKnifeNode组件节点智能指针
     */
    static std::shared_ptr<ImageKnifeNode> CreateImageKnifeNodeAnimator(std::shared_ptr<ImageKnifeOption> option,
                                                                        std::shared_ptr<AnimatorOption> animatorOption);
    /**
     * @brief 设置组件的同步加载状态，未调用时默认不使用同步加载
     * @param syncLoad 为true则使用同步加载，为false则使用异步加载
     */
    virtual void SyncLoad(bool syncLoad) = 0;
    /**
     * @brief 设置图片是否可以拖拽，未调用时默认不可拖拽
     * 动图组件设置该属性无效
     * @param draggable 为true图片可以拖拽，为false则不可拖拽
     */
    virtual void Draggable(bool draggable) = 0;
    /**
     * @brief 设置组件的宽度
     * @param width 组件的宽度，单位vp
     */
    virtual void SetWidth(float width) = 0;
    /**
     * @brief 设置组件的高度
     * @param height 组件的高度，单位vp
     */
    virtual void SetHeight(float height) = 0;
    /**
     * @brief 设置组件的百分比宽度
     * @param width 组件的百分比宽度
     */
    virtual void SetPercentWidth(float width) = 0;
    /**
     * @brief 设置组件的百分比高度
     * @param height 组件的百分比高度
     * @return
     */
    virtual void SetPercentHeight(float height) = 0;
    /**
     * @brief 使用新的图片加载参数更新组件显示的图片
     * 会更新内部的ImageKnifeRequest对象，发起新的图片加载请求
     * @param option 图片加载参数对象
     */
    virtual void Update(std::shared_ptr<ImageKnifeOption> option) = 0;
    /**
     * @brief 更新动图组件的图片播放状态
     * @param animatorOption 动图组件播放状态对象
     */
    virtual void UpdateAnimatorOption(std::shared_ptr<AnimatorOption> animatorOption) = 0;
    /**
     * @brief 组件下树不使用后需调用此接口
     */
    virtual void DisposeNode() = 0;
    /**
     * @brief 获取组件当前的加载请求对象
     * @return 返回加载请求对象智能指针
     */
    virtual std::shared_ptr<ImageKnifeRequest> GetImageKnifeRequest() const = 0;
    /**
     * @brief 获取原始ArkUI节点的handle
     * @return 返回原始ArkUI_NodeHandle
     */
    virtual ArkUI_NodeHandle GetHandle() const = 0;
    virtual ~ImageKnifeNode() = default;
};

} // namespace ImageKnifePro

#endif // IMAGE_KNIFE_C_IMAGEKNIFE_NODE_H
